package com.dp.client.views.reportesCharts;

import java.util.Date;

import org.moxieapps.gwt.highcharts.client.BaseChart;
import org.moxieapps.gwt.highcharts.client.Chart;
import org.moxieapps.gwt.highcharts.client.Point;
import org.moxieapps.gwt.highcharts.client.Series;
import org.moxieapps.gwt.highcharts.client.events.PointClickEvent;
import org.moxieapps.gwt.highcharts.client.events.PointClickEventHandler;
import org.moxieapps.gwt.highcharts.client.plotOptions.SeriesPlotOptions;

import com.dp.client.dto.Reportes;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.reporte.IServiciosReporte;
import com.dp.client.servicios.reporte.IServiciosReporteAsync;
import com.dp.client.servicios.simulacion.IServiciosSimulacion;
import com.dp.client.servicios.simulacion.IServiciosSimulacionAsync;
import com.dp.client.util.Alerts;
import com.dp.client.views.Geografico;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.user.datepicker.client.DateBox;
import com.google.gwt.user.client.ui.ListBox;

public class ReportePrincipal extends Composite {
	//final Series series;
	private int aux=0;
	double []ar=new double [15];
	Timer tempTimer ;
	private HorizontalPanel PanelReporte;
	HorizontalPanel horizontalPanel_1;
	Point [] points;
	Point [] points2;
	int pos;
	int tam;

	Geografico g=new Geografico(-1);

	final IServiciosReporteAsync sevicio_reporte = GWT.create( IServiciosReporte.class );

	public ReportePrincipal() {
		HorizontalPanel horizontalPanel = new HorizontalPanel();
		horizontalPanel.setSize("800px", "600px");
		/*Point [] points=new Point[3];
		
		points[0] = new Point("FF", 33);
		points[1] = new Point("GG", 27);
		points[2] = new Point("HH", 40);
		String nombre="recontra gg";
		
		Point [] points2=new Point[3];
		
		points2[0] = new Point("FF", 13);
		points2[1] = new Point("GG", 45);
		points2[2] = new Point("HH", 49);
		//CrearBackPieChart chart = new CrearBackPieChart(points, nombre, "entero");
		//CrearColumnRotateLabel chart=new CrearColumnRotateLabel(points,nombre,"entero","Capacidad","Capacidad");
		//CrearStackedColumns chart= new CrearStackedColumns(points, points2, nombre, "entero", "Capacidad");
		
		CrearSplineUpdatingEachSecond chart2= new CrearSplineUpdatingEachSecond("Capacidad de almacenes","Capacidad","entero");
		Chart chart=chart2.getChart();
		series = chart.createSeries();
        chart.addSeries(series
            .setName("Random data")
        );

        // Generate an array of random data
        long time = new Date().getTime();
        for(int i = -19; i <= -10; i++) {
        	series.addPoint(time + i * 1000, com.google.gwt.user.client.Random.nextDouble(),false,false,true);
        }
        for (int i=0;i<15;i++)
        	ar[i]=com.google.gwt.user.client.Random.nextDouble();
        //series.addPoint(time + -4 * 1000, com.google.gwt.user.client.Random.nextDouble());
        final int aux=0;
        tempTimer= new Timer() {
            @Override
            public void run() {
                //series.addPoint(
                    //new Date().getTime(),
                    //5.0,
                    //true, true, true
                //);
                actualizar();
                //aux++;
                //if (aux>=15)
                //	tempTimer.cancel();
            }
        };
        tempTimer.scheduleRepeating(1000);*/
        //horizontalPanel.add(chart);
        
		//horizontalPanel.add(chart.getChart());
		initWidget(horizontalPanel);
		
		FlexTable flexTable = new FlexTable();
		horizontalPanel.add(flexTable);
		flexTable.setSize("800px", "20px");
		
		FlexTable flexTable_1 = new FlexTable();
		flexTable.setWidget(0, 0, flexTable_1);
		
		Button btnEnvios = new Button("Envios");
		btnEnvios.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				reportePaquete(0,0,0);
			}
		});
		flexTable_1.setWidget(0, 0, btnEnvios);
		
		Button btnNewButton = new Button("Almacenes");
		btnNewButton.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				reporteAlmacenes();
			}
		});
		flexTable_1.setWidget(0, 2, btnNewButton);
		
		horizontalPanel_1 = new HorizontalPanel();
		flexTable.setWidget(1, 0, horizontalPanel_1);
		
		Label lblAplicarCambiosHora = new Label("Aplicar cambios hora :");
		horizontalPanel_1.add(lblAplicarCambiosHora);
		
		final DateBox dateBoxAplica = new DateBox();
		horizontalPanel_1.add(dateBoxAplica);
		
		final ListBox comboBoxAplica = new ListBox();
		horizontalPanel_1.add(comboBoxAplica);
		
		Button btnAplicar = new Button("Aplicar");
		horizontalPanel_1.add(btnAplicar);
		
		HorizontalPanel horizontalPanel_2 = new HorizontalPanel();
		flexTable.setWidget(2, 0, horizontalPanel_2);
		
		Label lblAplicarEnRango = new Label("Aplicar en rango :");
		horizontalPanel_2.add(lblAplicarEnRango);
		
		final DateBox dateBoxInicio = new DateBox();
		horizontalPanel_2.add(dateBoxInicio);
		
		final DateBox dateBoxFin = new DateBox();
		horizontalPanel_2.add(dateBoxFin);
		
		final Button btnRango = new Button("New button");
		btnRango.setText("Aplicar");
		horizontalPanel_2.add(btnRango);
		btnRango.addClickHandler( new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				if( dateBoxInicio.getValue() == null ||
					dateBoxFin.getValue() == null ){
					Alerts.dialogErrorPersonalizado("Ingrese Rango de fechas Valido");
					return;
				}
				sevicio_reporte.aplicar_cambio_en_rango(dateBoxInicio.getValue(), dateBoxFin.getValue() , new AsyncCallback<Boolean>() {
					@Override
					public void onSuccess(Boolean result) {
						Alerts.dialogErrorPersonalizado("Se realizo la modificacion con exito");
					}
					@Override
					public void onFailure(Throwable caught) {
						Alerts.dialogErrorConexion();
					}
				});
			}
		});
		PanelReporte = new HorizontalPanel();
		flexTable.setWidget(3, 0, PanelReporte);
		PanelReporte.setSize("795px", "563px");
		String [] ops = { "Seleccione", "Recoger Paquetes" , "Aterrizar Vuelos" , "Ingresar Almacen", "Subir Avion" , "Despegar Avion" , "Todo"};
		for( int i = 0 ; i < ops.length ; i++ ){
			comboBoxAplica.addItem( ops[ i ], i + "" );
		}
		comboBoxAplica.setItemSelected( 0 ,  true );
		btnAplicar.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if( dateBoxAplica.getValue() == null ) {
					Alerts.dialogErrorPersonalizado("Ingrese una fecha");
					return;
				}			
				if( comboBoxAplica.getSelectedIndex() < 1  ){
					Alerts.dialogErrorPersonalizado("Seleccione una opcion valida");
					return;
				}
				
				sevicio_reporte.aplicar_cambio( dateBoxAplica.getValue() , comboBoxAplica.getSelectedIndex() + "", new AsyncCallback<Boolean>() {
				@Override
				public void onFailure(Throwable caught) {
					Alerts.dialogErrorConexion();
				}
				@Override
					public void onSuccess(Boolean result) {
						Alerts.dialogErrorPersonalizado("Se realizo la modificacion con exito");
					}
				});
			}
		});
	}
	/*
	protected void actualizar() {
		if (aux>14) {
			tempTimer.cancel();
			return;}
		series.addPoint(new Date().getTime(),ar[aux],true,true,true);
		aux++;
	}*/

	protected void reporteAlmacenes() {
		horizontalPanel_1.clear();
		IServiciosAlmacenAsync serviciosAlmacen = GWT.create(IServiciosAlmacen.class);
		serviciosAlmacen.getReporteAlmacen(new Date(), new Date(), new AsyncCallback< Reportes >(){
			@Override
			public void onSuccess(Reportes result) {
				points= new Point[result.pointsX.size()];
				points2= new Point[result.pointsX.size()];
				for (int i=0;i<result.pointsX.size();i++){
					points[i]=new Point(result.pointsX.get(i),result.pointsYLow.get(i));
					points2[i]=new Point(result.pointsX.get(i),result.pointsYHigh.get(i));
				}
				tam=points.length;
				pos=0;
				dibujarAlmacen(0);
				Button btnRetroceder= new Button("Retroceder");
				btnRetroceder.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent event) {
						if (pos - 4>=0){
							pos-=4;
							dibujarAlmacen(pos);
						}
						
					}
				});
				horizontalPanel_1.add(btnRetroceder);
				Button btnAvanzar = new Button("Avanzar");
				btnAvanzar.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent event) {
						if(pos + 4 <tam){
							pos+=4;
							int gg = tam-pos < 4 ? tam-4:pos;
							dibujarAlmacen(gg);
						}
					}
				});
				horizontalPanel_1.add(btnAvanzar);
				//PanelReporte.add(chart.getChart());
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});	
	}
	
	public void dibujarAlmacen(int pos){
		Point [] p1;
		Point [] p2;
		int n= tam-pos<4?tam-pos:4;
		p1=new Point[n];
		p2=new Point[n];
		for (int i=0;i<n;i++){
			p1[i]=points[pos+i];
			p2[i]=points2[pos+i];
		}
		
		CrearStackedColumns chart= new CrearStackedColumns(p1, p2, "Almacenes", "entero", "Capacidad");
		PanelReporte.clear();
		PanelReporte.add( chart.getChart() );
	}
	
	protected void reportePaquete(int idCiudad, int idPais, int idContinente)
	{
		PanelReporte.clear();
		IServiciosReporteAsync servicioReporte = GWT.create(IServiciosReporte.class);
		servicioReporte.ReportePaquete(idCiudad,idPais,idContinente,new AsyncCallback<Reportes>() {

			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void onSuccess(Reportes result) {
				Point [] points= new Point[result.pointsX.size()];
				for (int i=0;i<result.pointsX.size();i++){
					//int num=result.pointsDouble.get(i);
					points[i]=new Point(result.pointsX.get(i),result.pointsYHigh.get(i));
				}
				horizontalPanel_1.clear();
				
				Button btnBuscar = new Button("Buscar");
				btnBuscar.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent event) {
						reportePaquete(g.getIdCiudad(),g.getIdPais(),g.getIdContinente());
					}
				}); 
				horizontalPanel_1.add(g);
				horizontalPanel_1.add(btnBuscar);
				
				CrearBackPieChart chart = new CrearBackPieChart(points,"Reporte de Paquete", "entero");
				PanelReporte.clear();
				PanelReporte.add(chart.getChart());
			}
		});
	}
}
